package com.cykj.controller;

import com.cykj.common.dto.ResponseDTO;
import dev.langchain4j.model.openai.OpenAiChatModel;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@RestController
@RequestMapping("/ai-service")
@Tag(name = "AI客服功能")
@CrossOrigin
public class AIServiceController {

    @Autowired
    private OpenAiChatModel openAiChatModel;

    // 存储用户会话状态，实现用户隔离（仅记录基础状态，不保存历史对话）
    private static final Map<String, UserSession> userSessions = new ConcurrentHashMap<>();

    /**
     * 用户提问接口
     * 无记忆功能，每次提问都是独立处理
     */
    @PostMapping("/ask")
    public ResponseEntity<ResponseDTO> askQuestion(
            @RequestBody Map<String, String> requestBody,
            HttpServletRequest request) {

        // 获取用户唯一标识（使用sessionId实现用户隔离）
        String sessionId = request.getSession().getId();
        String question = requestBody.getOrDefault("question", "");

        if (question.trim().isEmpty()) {
            return ResponseEntity.badRequest().body(ResponseDTO.error(400, "提问内容不能为空"));
        }

        // 检查是否是常见问题，优先返回预设答案
        String commonAnswer = CommonQuestions.getAnswer(question);
        if (commonAnswer != null) {
            // 更新用户会话状态
            updateUserSession(sessionId, question, commonAnswer);
            return ResponseEntity.ok(ResponseDTO.success(buildResponseData(question, commonAnswer)));
        }

        // 非常见问题，调用AI生成回答
        String aiAnswer = generateAIAnswer(question);

        // 更新用户会话状态（仅记录最后一次交互，不保存历史）
        updateUserSession(sessionId, question, aiAnswer);

        return ResponseEntity.ok(ResponseDTO.success(buildResponseData(question, aiAnswer)));
    }

    /**
     * 获取当前用户会话状态
     */
    @GetMapping("/status")
    public ResponseEntity<ResponseDTO> getSessionStatus(HttpServletRequest request) {
        String sessionId = request.getSession().getId();
        UserSession session = userSessions.get(sessionId);

        if (session == null) {
            return ResponseEntity.ok(ResponseDTO.success("未开始对话"));
        }

        return ResponseEntity.ok(ResponseDTO.success(Map.of(
                "lastQuestion", session.lastQuestion,
                "lastAnswer", session.lastAnswer,
                "updateTime", session.updateTime
        )));
    }

    /**
     * 清除当前用户会话
     */
    @PostMapping("/clear")
    public ResponseEntity<ResponseDTO> clearSession(HttpServletRequest request) {
        String sessionId = request.getSession().getId();
        userSessions.remove(sessionId);
        return ResponseEntity.ok(ResponseDTO.success("会话已清除"));
    }

    // 生成AI回答
    private String generateAIAnswer(String question) {
        // 构建招聘软件客服的系统提示词
        String systemPrompt = "你是一家招聘软件的AI客服，负责解答用户关于软件功能、使用流程、账号问题等咨询。" +
                "回答要简洁明了，专业友好，只针对当前问题进行解答，不需要记忆历史对话。";

        String prompt = String.format("用户问：%s\n请以招聘软件客服的身份回答，语言简洁专业。", question);
        return openAiChatModel.chat(systemPrompt + "\n" + prompt);
    }

    // 更新用户会话状态
    private void updateUserSession(String sessionId, String question, String answer) {
        UserSession session = new UserSession();
        session.lastQuestion = question;
        session.lastAnswer = answer;
        session.updateTime = System.currentTimeMillis();
        userSessions.put(sessionId, session);
    }

    // 构建响应数据
    private Map<String, String> buildResponseData(String question, String answer) {
        return Map.of(
                "question", question,
                "answer", answer,
                "note", "本次回答为独立回复，不关联历史对话"
        );
    }

    // 用户会话类（仅记录最后一次交互，不保存完整历史）
    private static class UserSession {
        String lastQuestion;
        String lastAnswer;
        long updateTime;
    }

    // 常见问题静态类
    public static class CommonQuestions {
        // 存储常见问题与对应答案
        private static final Map<String, String> questionMap = new ConcurrentHashMap<>();

        // 静态初始化常见问题
        static {
            // 账号相关
            questionMap.put("如何注册账号", "您可以通过电子邮箱快速注册，注册后需完善个人信息即可使用。");
            questionMap.put("如何修改手机号", "进入「我的」-「设置」-「账号安全」中，可更换绑定手机号（需验证原手机号）。");

            // 功能相关
            questionMap.put("如何搜索职位", "首页顶部搜索栏输入关键词（职位名/公司名），可精准查找。");
            questionMap.put("如何投递简历", "浏览职位详情页，点击「立即沟通」后即可向hr投递简历，部分职位支持一键投递。");
            questionMap.put("如何查看投递记录", "在「我的」-「投递记录」中可查看所有投递的职位状态（已投递/已查看/已沟通）。");

            // 会员相关
            questionMap.put("会员有什么权益", "会员可享受简历置顶、ai面试等特权。");
            questionMap.put("如何开通会员", "「个人中心」页面点击「开通会员」，选择套餐并完成支付即可开通对应时长的会员服务。");
        }

        // 根据问题匹配答案（简单模糊匹配）
        public static String getAnswer(String question) {
            String lowerQuestion = question.toLowerCase();
            // 优先精确匹配
            for (Map.Entry<String, String> entry : questionMap.entrySet()) {
                if (lowerQuestion.contains(entry.getKey().toLowerCase())) {
                    return entry.getValue();
                }
            }
            return null;
        }
    }
}
